package cn.codewen.utils;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.http.HttpProtocol;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;

public class CosUtils {
    private static String secretId;
    private static String secretKey;
    private static String cosRegion;
    private static String bucketName;
    private static COSClient cosClient;


    static {

        //1. 创建properties对象
        Properties pro = new Properties();
        //2. 通过类加载器加载jdbc.properties文件
        InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("cos.properties");
        //3. 把jdbc.properties文件内容映射到pro对象中
        try {
            pro.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //4. 把对应的属性分别赋值
        secretId = pro.getProperty("secretId");
        secretKey = pro.getProperty("secretKey");
        cosRegion = pro.getProperty("cosRegion");
        bucketName = pro.getProperty("bucketName");


    }

    /**
     * 创建连接
     *
     * @return
     */
    public CosUtils() {
        // 1.建立连接
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
        // 2.设置 bucket 的地域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
        // clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region(cosRegion);
        ClientConfig clientConfig = new ClientConfig(region);
        // 这里建议设置使用 https 协议
        clientConfig.setHttpProtocol(HttpProtocol.https);
        // 3.生成 cos 客户端。
        cosClient = new COSClient(cred, clientConfig);
    }

    /**
     * 列出目录
     *
     * @return
     */
    public List listObjects(String prefix) {

        // Bucket的命名格式为 BucketName-APPID ，此处填写的存储桶名称必须为此格式
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
// 设置bucket名称
        listObjectsRequest.setBucketName(bucketName);
// prefix表示列出的object的key以prefix开始
        listObjectsRequest.setPrefix(prefix);
// deliter表示分隔符, 设置为/表示列出当前目录下的object, 设置为空表示列出所有的object
        listObjectsRequest.setDelimiter("");
// 设置最大遍历出多少个对象, 一次listobject最大支持1000
        listObjectsRequest.setMaxKeys(1000);
        ObjectListing objectListing = null;

        try {
            objectListing = cosClient.listObjects(listObjectsRequest);
        } catch (CosServiceException e) {
            e.printStackTrace();
            return null;
        } catch (CosClientException e) {
            e.printStackTrace();
            return null;
        }
        // common prefix表示表示被delimiter截断的路径, 如delimter设置为/, common prefix则表示所有子目录的路径
        List<String> commonPrefixs = objectListing.getCommonPrefixes();
        // object summary表示所有列出的object列表
        List<COSObjectSummary> cosObjectSummaries = objectListing.getObjectSummaries();
        for (COSObjectSummary cosObjectSummary : cosObjectSummaries) {

            // 文件的路径key
            String key = cosObjectSummary.getKey();
            // 文件的etag
            String etag = cosObjectSummary.getETag();
            // 文件的长度
            long fileSize = cosObjectSummary.getSize();
            // 文件的存储类型
            String storageClasses = cosObjectSummary.getStorageClass();


            System.out.println(key);
            System.out.println(etag);
            System.out.println(fileSize);
            System.out.println(storageClasses);
        }
        return cosObjectSummaries;

    }

    public String addDirs(String key){

        // Bucket的命名格式为 BucketName-APPID ，此处填写的存储桶名称必须为此格式
        //String bucketName = "examplebucket-1250000000";

// 命名要创建的目录，一定要以 '/' 结尾
        //String key = "cos_dir/";
// 创建一个大小为 0 的流
        InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(0);
        PutObjectResult putObjectResult = cosClient.putObject(bucketName, key, emptyContent, metadata);
        String etag = putObjectResult.getETag();
        return etag;


    }

    /**
     * 上传文件
     * @param localFilePath 本地文件路径
     * @param key  远程文件路径
     * @return
     */
    public PutObjectResult addFile(String localFilePath,String key){

        // 指定要上传的文件
        File localFile = new File(localFilePath);
// 指定文件将要存放的存储桶
        //String bucketName = "examplebucket-1250000000";
// 指定文件上传到 COS 上的路径，即对象键。例如对象键为folder/picture.jpg，则表示将文件 picture.jpg 上传到 folder 路径下
        // codewen/codewen.jpg 远程目录及文件
       // String key = "exampleobject";
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
        PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);

        return putObjectResult;

    }
}
